// #include <stdio.h>
// void my_strcat(int *pa,int *pb)
// {
//     int *pc=pa;//保存a的首地址
//  while(*pa!='\0')//找到a的'\0'的位置,然后再往后追加
//     {
//         pa++;
//     }
//     while(*pb!=0)
//     {
//         *pa=*pb;
//         pa++;
//         pb++;
//     }
//     *pa='\0';//新的字符串要以'\0'结尾
//     pa=pc;//重新令pa指向a的首地址
// }
// void my_strcpy(char* dest,const char* src)//目标地址destination,源地址source
// {
//     while(*dest++=*src++)//同时完成了'\0'的拷贝和'\0'的判断退出循环
//     {
//         ;
//     }
// }
// int main()//模拟实现strcat函数,即字符串的连接
// {
//     char a[50]="welcome to ";//数组名a是数组的首元素的地址,即&a[0]
//     char *pa,*pb="C language";//字符串的指针指向的是字符串的首元素的地址,即&a[0],和&b[0]
//     pa=a;
//     strcat(a,pb);
//     printf("%s\n",a);//输出同下面的printf("%s\n",pa);效果相同
//     printf("%s\n",pa);//输出 welcome to C language
//     printf("%c\n",*pa+1);//先解引用后加一，输出的是ASCII码表中w的下一个字符,即x
//     printf("%c\n",*(pa+1));//先指向下一个元素再解引用，输出a[1]的内容
//     return 0;
//     //综上,*(pa+i)等价于pa[i]，即a[i]
// }




// #include <stdio.h>
// int main()
// {
//     char* arr[3] = {"hello","world","china"};
//     printf("%c\n",(*(arr+1))[4]);
//     int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//     int (*arrayPtr)[10] = &a;
//     printf("%d\n", (*arrayPtr)[2]);
//     return 0;
// }



// #include <stdio.h>

// void printArray(int (*arr)[10], int rows) {
//     for (int i = 0; i < rows; i++) {
//         for (int j = 0; j < 10; j++) {
//             printf("%d ", (*arr)[i*10+j]); 
//             // 正确访问二维数组的元素其他方法，*(*(arr + i) + j)),arr[i][j]
//         }
//         printf("\n");
//     }
// }

// int main() {
//     int array[3][10] = {
//         {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
//         {11, 12, 13, 14, 15, 16, 17, 18, 19, 20},
//         {21, 22, 23, 24, 25, 26, 27, 28, 29, 30}
//     };
//     printArray(array, 3); // 传递二维数组和行数
//     return 0;
// }



// #include <stdio.h>
// //模拟实现strcmp函数,即字符串的比较
// int my_strcmp(const char* str1,const char* str2)//str表示字符串string的缩写
// {
//     while(*str1==*str2)
//     {
//         if(*str1=='\0')//如果str1和str2都指向'\0'，则说明两个字符串相等
//         {
//             return 0;
//         }
//         str1++;
//         str2++;
//     }
//     if(*str1>*str2)//如果str1指向的字符大于str2指向的字符，则说明str1大于str2
//     {
//         return 1;
//     }
//     else//如果str1指向的字符小于str2指向的字符，则说明str1小于str2
//     {
//         return -1;
//     }
// }
// int main()
// {
//     char* a="hello";
//     char* b="hello";
//     char* c="world";
//     char* d="hellow";
//     if(my_strcmp(a,b)==0)
//     {
//         printf("a==b\n");
//     }
//     else
//     {
//         printf("a!=b\n"); 
//     }
//     if(my_strcmp(a,c)==0)
//     {
//         printf("a==c\n");
//     }
//     else
//     {
//        printf("a!=c\n"); 
//     }
//     if(my_strcmp(a,d)==0)
//     {
//         printf("a==d\n");
//     }
//     if(my_strcmp(a,d)==1)
//     {
//         printf("a>d\n");
//     }
//     else if(my_strcmp(a,d)==-1)
//     {
//         printf("a<d\n"); 
//     }
//     return 0;
// }



#include <stdio.h>//模拟实现strstr函数，即子字符串的查找
// char* my_strstr(const char* str1,const char* str2)
// {
//     const char* s1=str1;//保存str1的首地址
//     const char* s2=str2;//保存str2的首地址
//     while(*str1!='\0')//遍历str1
//     {
//         s1=str1;//每次遍历str1时，s1都要指向str1的首地址
//         s2=str2;//每次遍历str1时，s2都要指向str2的首地址
//         while(*s1!='\0'&&*s2!='\0'&&*s1==*s2)//遍历str1和str2，直到str2遍历完或者str1和str2不相等
//         {
//             s1++;
//             s2++;
//         }
//         if(*s2=='\0')//如果str2遍历完了，则说明str1中包含str2
//         {
//             return (char*)str1;//返回str1的地址
//         }
//         str1++;//如果str2没有遍历完，则说明str1中不包含str2，str1向后移动一位
//     }
//     return NULL;//如果str1遍历完了，则说明str1中不包含str2
// }
char* my_strstr(const char* str1,const char* str2)
{
    const char* s1=str1;
    const char* s2=str2;
    while(*str1!='\0')
    {
        s1=str1;
        s2=str2;
        while(*s1!='\0'&&*s2!='\0'&&*s1==*s2)
        {
            s1++;
            s2++;
        }
        if(*s2=='\0')
        {
            return (char*)str1;//函数返回类型是char*，str1的类型是const char*，所以要强制类型转换
            //为什么不能返回(char*)s1呢？因为s1已经指向子字符串的末尾了，而不是子字符串的首地址
        }
        str1++;
    }
    return NULL;    
}
int main()
{
    char a[]="hello world";
    char b[]="world";
    if(my_strstr(a,b)==NULL)//找字符串a中是否有字符串b
    {
        printf("a don't have b\n");
    }
    else
    {
        printf("a have b\n"); 
    }
    return 0;
}